package com.demo.java.OD301_350.OD332;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【比赛的冠亚季军(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146150068
 */
public class OdMain {
    // 存储胜者和败者
    public static List<Sman> win = new ArrayList<>();
    public static List<Sman> lose = new ArrayList<>();

    // 定义运动员类，实现Comparable接口用于排序
    static class Sman implements Comparable<Sman> {
        int id;
        int power;

        // 构造函数
        public Sman(int id, int power) {
            this.id = id;
            this.power = power;
        }

        // 比较规则：优先按实力值排序，实力大的排前面，若实力相等，则按ID排序
        @Override
        public int compareTo(Sman o) {
            return Comparator.comparingInt((Sman p) -> p.power).reversed()
                    .thenComparingInt(p -> p.id)
                    .compare(this, o);
        }
    }

    public static void main(String[] args) {
        // 创建扫描器读取输入
        Scanner sc = new Scanner(System.in);

        // 读取输入的字符串并分割成数组
        String[] strings = sc.nextLine().split(" ");

        // 将运动员的实力值存储到列表中
        List<Sman> list = new ArrayList<>();
        for (int i = 0; i < strings.length; i++) {
            Sman sman = new Sman(i, Integer.valueOf(strings[i]));
            list.add(sman);
        }

        // 递归处理比赛，获取前三名
        solveMethod(list);

        // 排序，胜者和败者按ID升序排列
        win.sort(Comparator.naturalOrder());
        lose.sort(Comparator.naturalOrder());

        // 输出前三名的运动员ID
        System.out.println(win.get(0).id + " " + win.get(1).id + " " + lose.get(0).id);

        // 关闭扫描器
        sc.close();
    }

    // 递归方法，处理比赛逻辑
    public static void solveMethod(List<Sman> list) {
        // 存储中间结果
        List<Sman> resList = new ArrayList<>();
        int size = list.size();
        Iterator<Sman> iterator = list.iterator();

        // 遍历运动员进行比赛
        while (iterator.hasNext()) {
            Sman one = iterator.next();
            if (!iterator.hasNext()) {
                // 如果只剩一个运动员，则直接添加到结果中
                if (size == 3) {
                    win.add(one);
                } else {
                    resList.add(one);
                }
                break;
            }

            // 获取下一个运动员进行比较
            Sman two = iterator.next();

            // 比较两者实力，决定胜负
            if (one.power >= two.power) {
                if (size <= 4) {
                    win.add(one);  // 胜者加入胜者列表
                    lose.add(two); // 败者加入败者列表
                } else {
                    resList.add(one);  // 胜者继续比赛
                }
            } else {
                if (size <= 4) {
                    win.add(two);  // 胜者加入胜者列表
                    lose.add(one); // 败者加入败者列表
                } else {
                    resList.add(two);  // 胜者继续比赛
                }
            }
        }

        // 如果还有剩余运动员，继续递归处理
        if (!resList.isEmpty()) {
            solveMethod(resList);
        }
    }
}